// function f() {
//     console.log("f(): evaluated");
//     return function (target: Function, propertyKey: string, descriptor: PropertyDescriptor) {
//         console.log("f(): called");
//     }
// }

// 装饰器的签名
// declare type ClassDecorator =
//   <TFunction extends Function>(target: TFunction) => TFunction | void;
// declare type PropertyDecorator =
//   (target: Object, propertyKey: string | symbol) => void;
// declare type MethodDecorator = <T>(
//   target: Object, propertyKey: string | symbol,
//   descriptor: TypedPropertyDescriptor<T>) =>
//     TypedPropertyDescriptor<T> | void;


// 修饰器 - 无侵入式增强
function f<T extends { new(...args: any[]): {} }>(constructor: T) {
    class Controller extends constructor {
        constructor(...args: any[]) {
            super(args)
            console.log('装饰器');
        }
    }
    return Controller
}

function z(target: Object, propertyName: string) {
    console.log(target, propertyName);
}

@f
class C {
    @z
    method() {}
}

let c = new C()


// function classDecorator<T extends { new (...args: any[]): {} }>(constructor: T) {
//     return class extends constructor {
//            newProperty = "new property";
//            hello = "override";
//          };
// }

// @classDecorator
// class Greeter{
//     [key: string]: string
//     property = "property";
//     hello: string;
//    constructor(m: string) {
//         this.hello = m;
//     }
// }
// const greeter: Greeter = new Greeter("world");
// console.log({ greeter }, greeter.newProperty);


// 类装饰器
// 接口定义 declare type ClassDecorator = <TFunction extends Function>(target: TFunction) => TFunction | void;
// 1. target —— 对于静态成员来说是类的构造函数，对于实例成员是类的原型对象。

// function helloWord(target: Function) {
//     console.log('hello Word!', target);
// }

// @helloWord
// class HelloWordClass {
//     constructor() {
//         console.log('我是构造函数')
//     }
//     name: string = 'zzb';
// }


// type MyReadonly<T> = {
//     readonly [P in keyof T]: T[P]
// }

// type DictOf<T> = {[key: string]: T }
// type ActionDescriptor = [any, any]

// let objj: DictOf<ActionDescriptor> = {
//     one: [2, 2],
//     two: [2, 2],
// }

